#include<iostream>
#include<unistd.h>
#include<signal.h>

void handler(int signo)
{
    std::cout << "获得了一个信号 : " <<signo <<std::endl;

    //当这个信号的处理函数被调用的时候，内核会自动将当前信号加入信号屏蔽字block ，当信号
    //处理函数返回自动恢复原来的信号屏蔽字block；这样就保证了在处理某个信号时，如果这种信号
    //会再次产生，那么它会被阻塞到当前结束为止，即防止任意信号进行递归处理
    //在handler 中获取pending ,并打印
    while(true)
    {
        sigset_t pending;
        sigemptyset(&pending);
        sigpending(&pending);

        //打印
        for(int i = 31;i>0;i--)
        {
            if(sigismember(&pending , i))
            {
                std::cout << 1;
            }
            else{
                std::cout << 0;
            }
        }
        std::cout << std::endl;
        sleep(1);
    }
}

int main()
{
    //使用sigaction 来修改handler 表
    struct sigaction act , oact;
    act.sa_handler = handler;
    act.sa_flags = 0;
    sigemptyset(&(act.sa_mask));
    //sa_mask 位图，如果在调用信号处理函数的时候，处理当前信号被自动屏蔽之外，还希望自动屏蔽另外一些信号
    //则用sa_mask 字段说明这些需要额外屏蔽的信号
    sigaddset(&act.sa_mask , 3);
    sigaddset(&act.sa_mask , 4);
    sigaddset(&act.sa_mask , 5);
    sigaddset(&act.sa_mask , 6);
    sigaddset(&act.sa_mask , 7);

    sigaction(2, &act , &oact);
    while(true)
    {
        std::cout << "我是一个进程：" <<getpid() <<std::endl;
        sleep(1);
    }

    return 0;
}